﻿Namespace Connection

    Public Class DbTransactionWrapper
        Implements IDbTransaction

        Public Sub New(trn As IDbTransaction)
            Me.ActualTransaction = trn
        End Sub

        Public Property ActualTransaction As IDbTransaction

        Public Sub Commit() Implements System.Data.IDbTransaction.Commit
            Me.ActualTransaction.Commit()
        End Sub

        Public ReadOnly Property Connection As System.Data.IDbConnection Implements System.Data.IDbTransaction.Connection
            Get
                Return Me.ActualTransaction.Connection
            End Get
        End Property

        Public ReadOnly Property IsolationLevel As System.Data.IsolationLevel Implements System.Data.IDbTransaction.IsolationLevel
            Get
                Return Me.ActualTransaction.IsolationLevel
            End Get
        End Property

        Public Sub Rollback() Implements System.Data.IDbTransaction.Rollback
            Me.ActualTransaction.Rollback()
        End Sub

#Region "IDisposable Support"
        Private disposedValue As Boolean ' 重複する呼び出しを検出するには

        ' IDisposable
        Protected Overridable Sub Dispose(disposing As Boolean)
            If Not Me.disposedValue Then
                If disposing Then
                    ' TODO: マネージ状態を破棄します (マネージ オブジェクト)。
                End If

                ' TODO: アンマネージ リソース (アンマネージ オブジェクト) を解放し、下の Finalize() をオーバーライドします。
                ' TODO: 大きなフィールドを null に設定します。
                '#91　SQLServer環境下でDbTransactionWrapperでエラーが出る。 Fix
                If Me.ActualTransaction.Connection IsNot Nothing Then Me.ActualTransaction.Connection.Dispose()
            End If
            Me.disposedValue = True
        End Sub

        ' TODO: 上の Dispose(ByVal disposing As Boolean) にアンマネージ リソースを解放するコードがある場合にのみ、Finalize() をオーバーライドします。
        'Protected Overrides Sub Finalize()
        '    ' このコードを変更しないでください。クリーンアップ コードを上の Dispose(ByVal disposing As Boolean) に記述します。
        '    Dispose(False)
        '    MyBase.Finalize()
        'End Sub

        ' このコードは、破棄可能なパターンを正しく実装できるように Visual Basic によって追加されました。
        Public Sub Dispose() Implements IDisposable.Dispose
            ' このコードを変更しないでください。クリーンアップ コードを上の Dispose(ByVal disposing As Boolean) に記述します。
            Dispose(True)
            GC.SuppressFinalize(Me)
        End Sub
#End Region

    End Class

End Namespace
